﻿// ## 2023/05/20 # 铃 # 铃 # 完全汉化,重构新增部分逻辑 ##


namespace 攻城走位
{

    //---------------------------------------------------------------------------------------


    //---------------------------------------------------------------------------------------

    class Main
    {

        Main()
        {
            pk::bind(111, pk::trigger111_t(onTurnStart));
        }


        // 回合开始时更新
        void onTurnStart(pk::force @force)
        {
            if (pk::is_campaign())
                return;


            if (!pk::is_normal_force(force))
                return;
            optimize_current_force_target(); // 通用函数调用
        }



        // 优化当前回合势力部队的目标
        void optimize_current_force_target()
        {
            int force_id = pk::get_current_turn_force_id();
            if (!pk::is_normal_force(force_id))
                return;
            pk::force @force = pk::get_force(force_id);
            pk::unit @dst_unit;

            pk::array<pk::unit @> arr_unit_list = pk::list_to_array(pk::get_unit_list());
            if (int(arr_unit_list.length) == 0)
                return;
            for (int i = 0; i < int(arr_unit_list.length); i++)
            {
                pk::unit @unit = arr_unit_list[i];
                if (unit.weapon == 兵器_冲车 or unit.weapon == 兵器_木兽)
                {
                    if (pk::is_player_controlled(unit))
                        continue;

                        //寻找需要找位置的冲车部队
                    if (unit.target_type != 部队任务对象_据点)
                        continue;


                    if (unit.action_done)
                        continue;

                    if (!pk::is_valid_base_id(unit.target))
                        continue;

                    if (!ch::is_gate(unit.target))
                        continue;

                    //距离关隘2-3格
                    auto gate = pk::get_building(unit.target);
                    if (pk::get_distance(unit.pos, gate.pos) > 3)
                        continue;

                    if (pk::get_distance(unit.pos, gate.pos) <= 1)
                        continue;

                   // pk::trace(pk::decode(pk::get_name(unit)));


                //在自己身边3格以内,寻找和目标关隘距离为1的友军部队
                    pk::array<pk::point> arr_range = pk::range(unit.pos, 1, 3);

                    for (int j = 0; j < int(arr_range.length); j++)
                    {
                        pk::hex @hex = pk::get_hex(arr_range[j]);

                       // pk::trace("0寻找需要移动的目标" + arr_range[j].x + " " + arr_range[j].y);

                            //有一支部队
                        if (!hex.has_unit)
                            continue;

                        auto ally_unit = pk::get_unit(arr_range[j]);

                       // pk::trace("1寻找需要移动的目标" + pk::decode(pk::get_name(ally_unit)));

                        if (pk::get_distance(ally_unit.pos, gate.pos) > 1)
                            continue;

                        if (ally_unit.get_force_id() != unit.get_force_id())
                            continue;

                       // pk::trace("2寻找需要移动的目标" + pk::decode(pk::get_name(ally_unit)));

                        if (ally_unit.action_done)
                            continue;

                        if (ally_unit.weapon <= 兵器_战马 or ally_unit.weapon == 兵器_投石 or ally_unit.weapon == 兵器_井阑)
                        {
                           // pk::trace("3寻找需要移动的目标" + pk::decode(pk::get_name(ally_unit)));
                            @dst_unit = ally_unit;
                            break;
                        }

                    }


                    //先移动dst_unit,寻找一个空格.
                    if (dst_unit !is null)
                    {
                        //pk::trace("0移动目标" + pk::decode(pk::get_name(dst_unit)));

                        pk::array<pk::point> arr_range2 = pk::get_movable_pos(dst_unit);
                        for (int k = 0; k < int(arr_range2.length); k++)
                        {
                            pk::hex @hex2 = pk::get_hex(arr_range2[k]);


                            pk::point range_pos = arr_range2[k];
                            if (!pk::is_valid_pos(range_pos))
                                continue;

                            if (hex2.has_building)
                                continue;
                            if (hex2.has_unit)
                                continue;

                            int terrain_id = hex2.terrain;
                            if (!pk::is_valid_terrain_id(terrain_id))
                                continue;
                            if (!pk::is_enabled_terrain(terrain_id))
                                continue;

                           // pk::trace("移动的时候找到了空地" + range_pos.x + " " + range_pos.y);

                            bool move_done = false;
                            if (pk::get_distance(dst_unit.pos, range_pos) < 5)
                            {
                                //移动之前记录步兵的坐标
                                pk::point unit_pos_before = dst_unit.pos;
                                // auto unit_path = pk::get_path(dst_unit, dst_unit.pos, range_pos);
                                // pk::move(dst_unit, unit_path);

                                pk::set_order(dst_unit, 部队任务_移动, range_pos);
                                pk::run_order(dst_unit);

                                if (pk::is_in_screen(unit.pos))
                                {
                                    pk::say(pk::encode("\x1b[1x腾出位置!让\x1b[16x冲车部队\x1b[1x先上!!"), pk::get_person(dst_unit.leader));
                                }


                                if (pk::is_in_screen(unit.pos))
                                {
                                    string name = pk::decode(pk::get_name(pk::get_building(unit.target)));
                                    pk::say(pk::encode(pk::format("非常感谢!\x1b[16x{}\x1b[1x就交给我吧!",name)), pk::get_person(unit.leader), unit);
                                   // pk::say(pk::encode(pk::format("非常感谢!{}就交给我吧!", pk::get_name(gate))), pk::get_person(unit.leader),unit);

                                }
                                pk::set_order(unit, 部队任务_攻击, gate.pos);
                                pk::run_order(unit);


                                move_done = true;
                            }
                            if (move_done) break;

                        }
                    }
                }
            }
        }

    };

    Main main;
}